package site.lianwu.mybatis.plus.query.define;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

/**
 * 值验证器
 * <br>
 * 以静态内部类的形式定义不同的验证类以方便使用
 *
 * @author LianWu
 */
public enum Validator {

    ;

    /**
     * 不为空集合并且不为空白字符串
     * <p>（去除字符串前后空白后长度为0即为空白字符串）</p>
     */
    public static class NotEmptyAndNotBlank implements Validation {

        @Override
        public boolean validate(Object value) {
            if (value == null) {
                return false;
            }
            if (value instanceof CharSequence) {
                return StringUtils.isNotBlank((CharSequence) value);
            }
            return notEmpty(value);
        }
    }

    /**
     * 不为空集合并且不为空字符串
     * <p>（字符串长度为0即为空字符串）</p>
     */
    public static class NotEmpty implements Validation {

        @Override
        public boolean validate(Object value) {
            if (value == null) {
                return false;
            }
            if (value instanceof CharSequence) {
                return ((CharSequence) value).length() > 0;
            }
            return notEmpty(value);
        }
    }

    /**
     * 总是有效（即无需验证）
     */
    public static class AlwaysValid implements Validation {

        @Override
        public boolean validate(Object value) {
            return true;
        }

    }

    private static boolean notEmpty(Object value) {
        if (value.getClass().isArray()) {
            return Array.getLength(value) > 0;
        }
        if (value instanceof Collection) {
            return !((Collection<?>) value).isEmpty();
        }
        if (value instanceof Map) {
            return !((Map<?, ?>) value).isEmpty();
        }
        if (value instanceof Iterable) {
            return ((Iterable<?>) value).iterator().hasNext();
        }
        if (value instanceof Iterator) {
            return ((Iterator<?>) value).hasNext();
        }
        return true;
    }

}
